<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
<script>
    // //声明了一个fun1的函数
    // function fun1(){
    //     console.log("函数fun1成功被调用");
    // }
    // fun1()//调用函数
    //封装了一个名叫"fun2"的函数，作用是可以运行加减算法 a,b是形参
//     function fun2(a,b){
//         return a+b
//     }
// console.log( fun2(10,20));//10，20是实参
// //实参如果是基本数据类型(number,string,bol)，在函数中修改形参的值不影响原值，如果是(arr,obj)等引用数据类型会改变原值
// let a=10
// function fun3(n){
//     n++
//    console.log(n);
// }
// fun3(a)
// console.log(a);
// let obj = {name:"张三",age:26}
// function fun4(info){
//     info.name="李四"
// }
// fun4(obj)
// console.log(obj);
// // 变量式声明函数
let fun6= function(){

console.log("成功调用我了！！！");
}
fun6();
// 匿名函数  自调用函数
    (function(a,b){
        console.log("我是匿名函数被调用了");
        console.log(a+b);
    })(15,20)
    //参数作用域 
    function fun7(a,b){
        console.log(a,b);
        let str ="abc"
    }
    // console.log(b,"...............................................");


//     //参数默认值
//     function fun8( str,num){
//        num= num==undefined?0:num                        
//         str=str||"默认值"
//         console.log(str,".........",num);
//     }
//     fun8("ok",20)//若不传实参则用默认值，若传则用传的值
//     //对位
//     function fun9(name,age,sex,job,hight){
//         console.log(`姓名:${name}----年龄:${age}----工作{job-}---身高${hight}`);
//     }
//     fun9("张三",22,"男","敲代码",180)
//     //
//     function fun10(){
//  console.log(arguments);
// //  arguments.map()  //arguments  是一个伪数组 有数组的小标和长度属性的 但不可以使用数组方法
//      arguments=  Array.prototype.slice.call(arguments)
//      console.log(arguments);
//   let sum= arguments.reduce(function(per,cur){2
//          return per +=cur
       
//      })
// // let sum = 0
// //         for(let i=0;i<arguments.length;i++){
// //             sum +=arguments[i]
// //         }
//         console.log(sum);
//     }
//     fun10(1,2,4,5,6,8)

//         //地址传递
//         var stu={name:"张三",major:"软件技术"}
//         function test_2(obj){
//             obj.major="软件工程";
//         }
//         test_2(stu);
//         function test_1(obj){
//             obj.major="计算机应用"
//         }
//         test_1(stu)
//         console.log(stu.major);
//函数返回值
// let num = [2,4,7,9]
//  function fun11() {
//      console.log("return之前正常输出");
//      return 5*2
//     console.log("return之后不执行");
// }
// console.log(fun11());


//闭包函数
// function fun12(){
//     let i=10
//     console.log(i);
//     function fun13(){
//         //对父级作用域变量的操作 计算后会存储在内存中 下次计算会直接从内存中取值
//         i=i+1
//         console.log(i);
//     }
//       return fun13()
// }
// fun12()
// let fun12back=fun13()
// let num1=10, num2=13;

//  function fun13(){
//   console.log(num1+num2);
// }
// num2=0
// fun13()
// function fun14(a,b,type){
//     let num1 = a
//     let num2 = b
//     switch(type){
//         case "+":
//      return function(){
//      console.log(`num1 + num2=${num1+num2}`);
//         }
//     } 
// }
//   let aaa= fun14(10,20,"+") 
//     aaa()

        function fun15(n){
            console.log(n);
            if(n<=1){
                return 0
            }else{
                // return n = fun15(n-1)
                return n = arguments.callee(n-1)
            }
           
        }
        fun15(10)
        console.log(fun15(10));
</script>